刚换工作不久,这段时间主要的工作就是开发 Nodejs,用了很多 redis。随便聊聊 Redis 一些使用经验,如果有不妥或者错误之处,欢迎指正。
Redis 自身的特色:
- 所有操作均为原子操作,即不可分割操作。
- 通常为单进程,内部为队列实现,但是由于直接操作内存,所以很快。
- 支持多种数据结构(相对memcached)。
- 默认有定时写入硬盘功能。
- 等等(参考http://blog.nosqlfan.com/html/3537.html)
先说说第四点,如果现在突然重启 redis,redis 里面还会有数据,但是这些数据是 redis 重启前最后一次写入硬盘的数据,也就是存在着数据过期的情况。所以可以了解下强制 BGSAVE 后重启这样。
参考文章:http://redis.readthedocs.org/en/latest/topic/persistence.html
前面三个就用这次的项目来聊聊,这次的业务主要是针对高并发下的抽奖。先看一段代码:
redis.hmget('user_xxxx', 'draw_time', function (err, draw_time){
if(!err && draw_time < 6){
doSomething();
redis.hmset('user_xxxx', 'draw_time', draw_time + 1, doSomethingElse);
return;
}
...
});
如果现在同时有 1000 个请求同时过来,很有可能在第一个请求执行 hmset 成功前有其他很多的请求会过来,因为此时draw_time很有可能还是0,那针对该用户的 doSomething 会远超过六次。
了解下 Hash 结构的操作,会发现 HINCRBY 和 HINCRBYFLOAT 这样可以直接针对 HASH 的键值进行增减的操作。上面的代码就可以简化成:
redis.hincryb('user_xxx', 'draw_time', 1, function (err, draw_time){
if(!err && draw_time < 7){
doSomething();
return;
}
...
});
当然,redis 还有其他很多很方便的操作,例如针对 String 类型的增减,以及 LIST 的 POP 这样的类型。同时 redis 还支持 multi 这样的事务。
先说这么多,总之用的越多越喜欢 redis。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。